home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Night Owl 6
/
Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso
/
049a
/
slhea201.zip
/
MAKEHEAD.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-06-09
|
14KB
|
511 lines
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "dos.h"
#include "sys/stat.h"
#define FALSE 0
#define TRUE 1
/*******************************************************************/
/* */
/* Create an header for a reply to a mail in SLMR 2.0 */
/* and MegaMail 2.1 */
/* By Serge Delbono */
/* Version 2.01 - 8 june 1991 */
/* Dedicated to public domain */
/* */
/*******************************************************************/
// BC ++ 2.0
/************************************************/
/*Use of compiling define : */
/*-DFRENCH : french language (default) */
/*-DENGLISH : english language */
/************************************************/
#ifndef ENGLISH
#define FRENCH
#endif
/*
Permet de lire un header du style :
(header SLMR)
123456789 123456789 123456789 123456789 123456789 123456789 123456789
===========================================================================
BBS: The Plywood PC
Date: 05-23-91 (02:00) Number: 1
From: GREG HEWGILL Refer#: NONE
To: ALL Recvd: NO
Subj: Welcome to SLMR 2.0! Conf: (0) Welcome!
---------------------------------------------------------------------------
et :
(header MegaMail)
0 1 2 3 4 5 6
123456789 123456789 123456789 123456789 123456789 123456789 123456789
Echo Flag : N Permanent: N Export: N Personal Read: Y
BBS: ALF Conference: MAIN Imported: 5/25/1991
To: SERGE DELBONO Num: 160 Date: 5/24/1991
From: ATTILA ALTAN Re: 0 Time: 10:08 pm
Subj: How are you'yau d'poele ? Prvt: N Read: N
*/
char buf [100] ; // buffer de lecture et formatage
char bbs[26] ; // Nom du serveur. BBS name
char date[26] ; // date du message (MM-JJ-AA) ou (MM/JJ/AAAA)
char from [26] ; // Emetteur
char to [26] ; // receveur
char subj [26] ; // Sujet
char datei[26] ; // date format national/date national format
char datel[26] ; // date en lettre (Samedi 1 juin 1991) / date in letters
char conf [26] ; // Conférence (seulement SLMR) / conf name (only SLMR)
char format [1024] ;
char *pform ; // Pointe vers le format du header / ptr to format
int eoinput = FALSE ;
#ifdef FRENCH
char *month[] = {
"janvier",
"février",
"mars",
"avril",
"mai",
"juin",
"juillet",
"aout",
"septembre",
"octobre",
"novembre",
"décembre",
} ;
char *week [] = {
"dimanche",
"lundi",
"mardi",
"mercredi",
"jeudi",
"vendredi",
"samedi",
} ;
#endif
#ifdef ENGLISH
char *month[] = {
"january",
"february",
"march",
"april",
"may",
"june",
"july",
"august",
"september",
"october",
"november",
"décember",
} ;
char *week [] = {
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
} ;
#endif
struct COUNTRY pays ;
// Réponse par défaut / default reply
char stdform[] =
#ifdef FRENCH
"Cher $F,\nDans un message adressé à $T,"
"vous écriviez, à propos de \"$S\":\n\n$Z"
"\nUn ami qui vous veut du bien, le $l" ;
#endif
#ifdef ENGLISH
"Dear $F,\nIn a message to $T,"
"you wrote about \"$S\":\n\n$Z"
"\nA friend of yours... $l" ;
#endif
/***************************************************/
/* Lit une ligne et affiche eventuellement "EOF" */
/* si fin de fichier */
/***************************************************/
int getline(int i)
{
memset (buf,0, 80) ;
if (eoinput)
return TRUE ;
if (gets(buf)==NULL){
#ifdef FRENCH
fprintf (stderr, "Fin de message ligne %d\n",i) ;
#endif
#ifdef ENGLISH
fprintf (stderr, "End of message line %d\n",i) ;
#endif
eoinput = TRUE ;
return TRUE ;
} /* fin if */
return FALSE ;
}
/***********************************/
/* */
/* rempli un item si il est la */
/* fill an item (if it's here) */
/* */
/***********************************/
void remplir (char *id, char *var)
{
int ok=FALSE ;
int i ;
int lim ;
if (memcmp(id, buf,6)==0){
memset (var,0,26) ;
strncpy (var, buf+6,25) ;
ok = TRUE ;
} else
if (memcmp (id, buf+54, 6)==0) {
memset (var,0,26) ;
strncpy (var, buf+60, 25) ;
ok = TRUE ;
} else if (memcmp (id, buf+37, 6) == 0) {
memset (var,0,26) ;
strncpy (var, buf+43, 25) ;
ok = TRUE ;
} /* fin if */
if (!ok) return ;
// ?#@\~# de Megamail
if ((var==bbs) &&( memcmp (buf+22,"Conference",10)==0))
lim = 14 ;
else
lim = 25 ; // bof !
var [lim] = 0 ;
for (i=lim-1;i>0 ;i-- ){
if (var[i] == ' ')
var[i]= '\0' ;
else
if (var[i]) break ;
} /* fin for */
}
/***********************************************************/
/* */
/* Met un nom en minuscule, avec majuscule la première */
/* lettre de chaque mot */
/* */
/***********************************************************/
void do_minus (char *buf)
{
int c ;
int tom = FALSE ;
while ((c=*buf)!=0){
if (tom){
c=tolower (c) ;
} else {
c=toupper(c) ;
} /* fin if */
if (!isalnum(c))
tom = FALSE ;
else tom = TRUE ;
*buf++ = c ;
} /* fin while */
}
/***********************************/
/* */
/* calcul le jour de la semaine */
/* compute day of week */
/* */
/***********************************/
int semaine (int jj,int mm,int aaaa)
// day month year
{
int siecle, aa ; // century and year in century
long magic ;
if (mm<=2){ // Janvier, fevrier ! gag !
mm += 12 ;
aaaa-- ;
} /* fin if */
mm -= 2 ;
siecle = aaaa/100 ;
aa = aaaa % 100 ;
magic = siecle/4 + aa/4 ;
magic = magic+(13*mm-1)/5 ;
magic = magic + aa + jj -2*siecle;
return (magic % 7) ;
}
/*******************************************/
/* */
/* Determination d'une date format court */
/* (JJ/MM/AAAA) */
/* get a date in short format */
/* (MM-DD-YYYY) */
/* */
/*******************************************/
void datecourte (int jour,int mois,int an,char *champs)
// day month year field to fill
{
switch (pays.co_date) {
case 0 : /* US */
sprintf (champs,"%02d%s%02d%s%04d", mois,
pays.co_dtsep, jour, pays.co_dtsep, an) ;
break ;
case 1 : /* france */
sprintf (champs,"%02d%s%02d%s%04d", jour,
pays.co_dtsep, mois, pays.co_dtsep, an) ;
break ;
case 2 : /* japan ? */
sprintf (champs,"%04d%s%02d%s%02d", an,
pays.co_dtsep, mois, pays.co_dtsep, jour) ;
break ;
}
}
/***************************************************/
/* */
/* determination d'une date au format long */
/* (lundi 3 juin 1991) */
/* get a date in long format */
/* (monday, june 3, 1991) */
/* */
/***************************************************/
void datelongue (int jour,int mois,int an,char *champ)
{
// determination du jour de la semaine
int jsem = semaine(jour,mois,an) ;
#ifdef FRENCH
sprintf (champ,"%s %d %s %d", week[jsem],jour, month[mois-1], an) ;
#endif
#ifdef ENGLISH
sprintf (champ,"%s, %s %d, %d", week[jsem],month[mois-1], jour, an) ;
#endif
}
/***********************************/
/*Put header on stdout : */
/*pbuf : begin of header format */
/*print : Flag if real printing */
/*stop on EOF or "$Z" */
/***********************************/
char *make_head(char *pbuf,int print)
{
char c ;
struct date da ;
static char temp [40] ;
int dollarz = FALSE ;
getdate (&da) ;
while (((c=*pbuf++) != 0) && !dollarz){
if (c!='$'){
if (print) putchar(c) ;
} else {
c=*pbuf++ ;
switch (c) {
case 0:
pbuf-- ;
break;
case 'F': case 'f' :
if (print) printf ("%s",from) ;
break;
case 'T': case 't' :
if (print) printf ("%s",to) ;
break;
case 'D':
if (print) printf ("%s",date) ;
break;
case 'L':
if (print) printf ("%s", datel) ;
break;
case 'I': case 'i' :
if (print) printf ("%s", datei) ;
break;
case 'S': case 's' :
if (print) printf ("%s",subj) ;
break;
case 'B': case 'b' :
if (print) printf ("%s",bbs) ;
break;
case 'C': case 'c' :
if (print) printf ("%s",conf) ;
break;
case 'Z': case 'z' :
dollarz = TRUE ;
break;
case 'd' :
if (print) {
datecourte (da.da_day, da.da_mon, da.da_year,temp) ;
printf ("%s",temp) ;
}
break ;
case 'l':
if (print) {
datelongue (da.da_day, da.da_mon, da.da_year,temp) ;
printf ("%s",temp) ;
}
break ;
default:
putchar (c) ;
;
} /* fin switch */
} /* fin if */
} /* fin while */
if (c){
return pbuf ;
} else {
return NULL ;
} /* fin if */
}
/***********************************/
/* */
/* - MAIN ROUTINE- */
/* */
/***********************************/
void main (argc, argv)
int argc; /* nb d' arguments */
char *argv[]; /* tableau d'arguments */
{
char c ;
int i ;
char *pbuf ;
struct stat st ;
#ifdef FRENCH
fputs("Création header pour SLMR (TM) et Megamail (TM) V2.01\n",stderr) ;
fputs("Par Serge Delbono. Copyright (c) S.Delbono 1991\n",stderr) ;
fputs("Avec la collaboration de Eric Soudy\n",stderr) ;
fputs("Dédié au domaine public\n",stderr) ;
fputs("Usage :\n",stderr) ;
fputs("MAKEHEAD [<fichier orig] [fichier header] >fichier destination\n",
stderr) ;
#endif
#ifdef ENGLISH
fputs("Creating header for SLMR (TM) and Megamail (TM) V2.01\n",stderr) ;
fputs("By Serge Delbono. Copyright (c) S.Delbono 1991\n",stderr) ;
fputs("With a little help of Eric Soudy\n",stderr) ;
fputs("Dedicated to public domain\n",stderr) ;
fputs("Usage :\n",stderr) ;
fputs("MAKEHEAD [<orig-file] [header file] >dest. file\n",
stderr) ;
#endif
fstat (fileno (stdin),&st) ;
if (st.st_mode & S_IFCHR){ // stdin redirigé ?
eoinput = TRUE ;
} /* fin if */
bbs[0] = from [0] = to [0] = date[0] = subj [0] = 0 ;
for (i = 1;i <=7 ;i++ ){
if (getline (i))
break ;
remplir (" BBS: ",bbs) ;
remplir (" To: ",to) ;
remplir ("From: ",from) ;
remplir ("Subj: ",subj) ;
remplir ("Date: ",date) ;
remplir ("Conf: ",conf) ;
if ((date[0]!='\0') && (bbs[0]!='\0')
&& ( to[0]!='\0') && (from[0]!='\0') && (subj[0]!='\0'))
break ;
} /* fin for */
// Ici on a tout
do_minus(from) ; do_minus(to) ;
// Calcul des dates en format "human readable"
country (0,&pays) ;
if (date[0] != '\0')
{
int jour, mois, an, jsem ;
jour = atoi (date+3) ;
mois = atoi (date) ;
an = atoi (date+6) ;
if (an < 100) {
if (an >80) an = an + 1900 ; else an = an + 2000 ;
// ca ne marchera plus après 2080 (je serai probablement mort)
}
datecourte (jour,mois,an,datei) ;
datelongue (jour,mois,an,datel) ;
}
// Lecture du format :
pform = stdform ;
if (argc >1){
FILE *fi ;
pbuf = format ;
fi = fopen (argv[1],"r") ;
if (fi==NULL){
#ifdef FRENCH
fprintf (stderr,"erreur lecture %s\n",argv[1]) ;
#endif
#ifdef ENGLISH
fprintf (stderr,"error reading %s\n",argv[1]) ;
#endif
} else {
pform = format ;
while ((c= getc (fi))!=EOF )
*pbuf++ = c ;
*pbuf='\0' ;
fclose (fi) ;
} /* fin if */
} /* fin if */
// On y va...
pbuf = pform ;
pbuf = make_head (pbuf, !eoinput) ;
// Recopie du reste du message
getline (8) ;
i = 9 ;
while (!eoinput){
getline (i++) ;
puts (buf) ;
} /* fin while */
if (pbuf)
make_head(pbuf,TRUE) ;
exit(0) ;
}